////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef __GAME_UTILS_H__
#define __GAME_UTILS_H__

////////////////////////////////////////////////////////////////////////////////////////////////////

//#include "CColladaCameraSceneNode.h"
//#include "CColladaMeshSceneNode.h"
//#include "CColladaSkinnedMeshSceneNode.h"
//#include "CColladaSceneNode.h"
#include "IMeshSceneNode.h"
#include <vector>

irr::scene::IMesh* GetMesh(irr::scene::ISceneNode* node);
void SetVertexColor(irr::scene::ISceneNode* node, const irr::video::SColor& color);
void SetVertexAlpha(irr::scene::ISceneNode* node, int alpha);
//void SetMaterialFlag(irr::scene::ISceneNode *Node, irr::video::E_MATERIAL_FLAG flag, bool newvalue);
//void SetMaterialBlendEq(irr::scene::ISceneNode *Node, irr::video::E_BLEND_EQ eq, bool updateChildren = true);
void SetMaterialTexture(irr::scene::ISceneNode *Node, int texID, irr::video::ITexture* tex);
void SetMaterialColorMaskRGBA(irr::scene::ISceneNode *Node, unsigned int mask);
//void SetMaterialDepthFunc(irr::scene::ISceneNode *Node, irr::video::E_COMPARE_FUNC f);
void SetMaterialAmbientColor(irr::scene::ISceneNode *Node, irr::video::SColor color);
void SetMaterialDiffuseColor(irr::scene::ISceneNode *Node, irr::video::SColor color);
void SetMaterialType(irr::scene::ISceneNode *Node, irr::video::E_MATERIAL_TYPE type);
irr::scene::ISceneNode * SetMaterialTypeByName(irr::scene::ISceneNode *Node, const char* texStr, irr::video::E_MATERIAL_TYPE type);
void SetMaterialThickness(irr::scene::ISceneNode *Node, float t);
void SetNodeRenderingLayer(irr::scene::ISceneNode *Node, int layer);

struct NodeMatTypeInfo
{
	irr::scene::ISceneNode * Node;
	int MaterialCount;
	std::vector<irr::video::E_MATERIAL_TYPE> MaterialTypes;
};

void FindMaterialTypes(irr::scene::ISceneNode *Node, std::vector<NodeMatTypeInfo*>& nodeMatTypes);
void SetMaterialTypes(const std::vector<NodeMatTypeInfo*>& nodeMatTypes);
void ReplaceMaterialType( irr::scene::ISceneNode *Node, irr::video::E_MATERIAL_TYPE oldType, irr::video::E_MATERIAL_TYPE type);

////////////////////////////////////////////////////////////////////////////////////////////////////

void SetAutomaticCulling(irr::scene::ISceneNode* Node, irr::scene::E_CULLING_TYPE cullType);
void ReplaceBoxAutomaticCullingWithFrustrumBox(irr::scene::ISceneNode* node);
irr::scene::IMeshSceneNode* GetColladaMeshFromVisualScene(irr::scene::ISceneNode *Node);
irr::scene::IMeshSceneNode* GetColladaSkinMeshFromVisualScene(irr::scene::ISceneNode *Node);
//void GetColladaMeshesListFromVisualScene(irr::scene::ISceneNode *Node, irr::core::array<irr::scene::CColladaMeshSceneNode*> *meshes);
//irr::collada::CCameraSceneNode* GetColladaCameraFromVisualScene(irr::scene::ISceneNode *Node);
//irr::collada::CSceneNode* GetColladaNodeFromVisualScene(const char* name , irr::scene::ISceneNode* Node);
irr::s32 random( int a , int b);
irr::s32 random(int a);
void UpdateNodeAbsPosition(irr::scene::ISceneNode* node);
void GetRotationFromVectorToVector(const irr::core::vector3df& from, const irr::core::vector3df& to, irr::core::matrix4& m);
void ResetDraw();	

////////////////////////////////////////////////////////////////////////////////////////////////////

enum {
	E_ENEMY_LIST ,
	E_FIEND_LIST , 
	E_CORRUPTOR_LIST , 
	E_CORRUPTED_LIST , 
	E_HEAVY_DAEMON_LIST , 
	E_BULLETS_LIST , 
	E_PLAYER_LIST,
	E_LEVEL_LIST,

	//keep it last 
	E_BUTTON_BACK,
};

irr::f32 Interp(irr::f32 valMin, irr::f32 valMax, irr::f32 stepMin, irr::f32 step, irr::f32 stepMax);


class TuneParam
{
public:
	TuneParam() : name() , listID(0) , ref(0) , minf(0) , maxf(0) , step(1.0f) , def(true)  {}
		
	TuneParam(irr::core::stringw n , irr::s32 lid , irr::f32* aref , irr::f32 min , irr::f32 max , irr::f32 aStep ) : name(n) , listID(lid) ,ref(aref) , minf(min) , maxf(max) , step(aStep) , def(true)  {}
	TuneParam& operator=(const TuneParam& other) { name = other.name; listID = other.listID ; minf = other.minf; maxf = other.maxf;  step = other.step ; def = other.def; return *this; }

	irr::core::stringw name ;
	irr::s32 listID;
	irr::f32* ref;
	irr::f32 minf ; 
	irr::f32 maxf ; 
	irr::f32 step;
	bool	 def;
		
};
////////////////////////////////////////////////////////////////////////////////////////////////////

#endif //__GAME_UTILS_H__

////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
